package br.com.vantagensaki.service;

import br.com.vantagensaki.dao.AnuncioDAO;
import br.com.vantagensaki.model.Anuncio;
import br.com.vantagensaki.utils.BaseService;
import br.com.vantagensaki.utils.exception.InfraestruturaException;
import br.com.vantagensaki.utils.exception.ObjetoNaoEncontradoException;
import br.com.vantagensaki.utils.exception.ViolacaoDeChaveUnicaException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author Marcello Willians
 */
@Service
public class AnuncioService extends BaseService {

    @Autowired
    private AnuncioDAO anuncioDAO;

    public AnuncioService() {
        super(AnuncioService.class);
    }

//    @Transactional(rollbackFor={RuntimeException.class, ViolacaoDeChaveUnicaException.class, InfraestruturaException.class})
    private void incluir(Anuncio anuncio) {

        anuncioDAO.inclui(anuncio);
    }

//    @Transactional(rollbackFor={RuntimeException.class, ViolacaoDeChaveUnicaException.class, InfraestruturaException.class})
    private void alterar(Anuncio anuncio) {

        anuncioDAO.altera(anuncio);
    }

    @Transactional(rollbackFor={RuntimeException.class, ViolacaoDeChaveUnicaException.class, InfraestruturaException.class})
    public synchronized void excluir(Anuncio anuncio) {

        anuncioDAO.exclui(anuncio);
    }

    @Transactional
    public synchronized void salvar(Anuncio anuncio) {

        if (anuncio.getId() == null){
            this.incluir(anuncio);
        } else{
            this.alterar(anuncio);
        }
    }

    public Anuncio getPorId(Long id) throws ObjetoNaoEncontradoException{
        return this.anuncioDAO.getPorId(id);
    }

    public List<Anuncio> getListaOrdenada() {
        return anuncioDAO.getListaOrdenada();
    }

    public Anuncio getPorTitulo(String titulo) throws ObjetoNaoEncontradoException {
        return anuncioDAO.getPorTitulo(titulo);
    }

}

//package br.uff.iduff2.service.academico;
//
//import br.uff.commons.mustang.exception.InfraestruturaException;
//import br.uff.commons.mustang.exception.ObjetoNaoEncontradoException;
//import br.uff.commons.utils.relatorio.exception.RelatorioException;
//import br.uff.commons.utils.service.BaseService;
//import br.uff.commons.utils.service.exception.ObjetoReferenciadoException;
//import br.uff.commons.utils.service.exception.ObjetoRemovidoException;
//import br.uff.commons.utils.service.exception.ServiceException;
//import br.uff.commons.utils.service.exception.ViolacaoDeChaveUnicaException;
//import br.uff.iduff2.contexto.ConstantesAplicacao;
//import br.uff.iduff2.dao.academico.CursoDAO;
//import br.uff.iduff2.dao.academico.DesdobramentoDAO;
//import br.uff.iduff2.dao.academico.ReconhecimentoCursoDAO;
//import br.uff.iduff2.modelo.academico.Aluno;
//import br.uff.iduff2.modelo.academico.CarteiraAlunoModel;
//import br.uff.iduff2.modelo.academico.Coordenacao;
//import br.uff.iduff2.modelo.academico.Curso;
//import br.uff.iduff2.modelo.academico.CursoLocalidade;
//import br.uff.iduff2.modelo.academico.CursoTurno;
//import br.uff.iduff2.modelo.academico.Desdobramento;
//import br.uff.iduff2.modelo.academico.Grau;
//import br.uff.iduff2.modelo.academico.Localidade;
//import br.uff.iduff2.modelo.academico.ReconhecimentoCurso;
//import br.uff.iduff2.modelo.academico.SituacaoCurso;
//import br.uff.iduff2.modelo.academico.SituacaoDesdobramento;
//import br.uff.iduff2.modelo.academico.Unidade;
//import br.uff.iduff2.modelo.siad.entity.transiente.SiadLocalidadeCursoTransiente;
//import br.uff.iduff2.relatorio.Relatorio;
//import br.uff.iduff2.relatorio.RelatorioFactory;
//import br.uff.iduff2.relatorio.academico.modelo.ModeloRelatorioCurso;
//import br.uff.iduff2.service.siad.SiadCursoService;
//import br.uff.iduff2.service.siad.SiadLocalidadeCursoService;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.GregorianCalendar;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Locale;
//import java.util.Map;
//import java.util.Set;
//import java.util.logging.Level;
//import java.util.logging.Logger;
//import org.hibernate.exception.ConstraintViolationException;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//@Service
//public class CursoService extends BaseService {
//
//    @Autowired
//    private CursoDAO cursoDAO;
//    @Autowired
//    private DesdobramentoDAO desdobramentoDAO;
//    @Autowired
//    private AlunoService alunoService;
//    @Autowired
//    private GrauService grauService;
//    @Autowired
//    private SiadCursoService siadCursoService;
//    @Autowired
//    private SiadLocalidadeCursoService siadLocalidadeCursoService;
//    @Autowired
//    private ReconhecimentoCursoDAO reconhecimentoCursoDAO;
//    @Autowired
//    private CoordenacaoService coordenacaoService;
//    @Autowired
//    private CursoTurnoService cursoTurnoService;
//
//    public CursoService() {
//        super(CursoService.class);
//    }
//
//    public List<Curso> getListaDeCursosPorLocalidade(Localidade localidade) {
//        return cursoDAO.getPorLocalidade(localidade);
//    }
//
//    @Transactional
//    public void alteraStatusCurso(Curso curso) {
//
//        try {
//            curso = cursoDAO.getPorIdComLock(curso.getIdCurso());
//
//            if (SituacaoCurso.SITUACAO_ATIVO.equals(curso.getStatus())) {
//                desativarDesdobramentos(curso);
//                curso.setStatus(SituacaoCurso.SITUACAO_DESATIVADO);
//            } else {
//                curso.setStatus(SituacaoCurso.SITUACAO_ATIVO);
//            }
//            cursoDAO.altera(curso);
//        } catch (ObjetoNaoEncontradoException ex) {
//            ex.printStackTrace();
//        }
//    }
//
//    public Curso getComReconhecimentos(Curso curso) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getComReconhecimentos(curso);
//    }
//
//    public List getListaCurso() {
//        return cursoDAO.getListaOrdenada();
//    }
//
//    public Long getMaiorCodigo() {
//        try {
//            return cursoDAO.getMaiorCodigo();
//        } catch (ObjetoNaoEncontradoException e) {
//            return null;
//        }
//    }
//
//    @Transactional
//    private void desativarDesdobramentos(Curso curso) {
//
//        List<Desdobramento> desdobramentos = null;
//
//        desdobramentos = desdobramentoDAO.getPorCurso(curso);
//
//        for (Desdobramento desd : desdobramentos) {
//            desd.setStatus(SituacaoDesdobramento.SITUACAO_DESATIVADO);
//            desdobramentoDAO.altera(desd);
//        }
//    }
//
//    @Transactional(rollbackFor={RuntimeException.class, ViolacaoDeChaveUnicaException.class, InfraestruturaException.class})
//    public synchronized void incluir(Curso curso, Coordenacao coordCurso) throws ViolacaoDeChaveUnicaException, ServiceException, ObjetoRemovidoException {
//
//        if (curso.getCodigo() != null) {
//            throw new ServiceException(getMensagemBundled(ConstantesAplicacao.CAMINHO_BUNDLE_SERVICE, "erroCodigoCursoPreenchidoNaTela"));
//        }
//
//        if (curso.getSemestreVigencia() != 1 && curso.getSemestreVigencia() != 2){
//            throw new ServiceException(getMensagemBundled(ConstantesAplicacao.CAMINHO_BUNDLE_SERVICE, "erroSemestreVigenciaCursoInvalido"));
//        }
//
//        if (curso.getDataVigencia() == null) {
//            curso.setDataVigencia(new GregorianCalendar());
//        }
//
//        Curso c = null;
//        try {
//            c = getPorNomeELocalidade(curso.getNome(), curso.getLocalidadePrincipal());
////            if (c != null) {
//                throw new ServiceException("J� existe um curso com o mesmo nome na mesma localidade.");
////            }
//        } catch (ObjetoNaoEncontradoException ex) {
////            Logger.getLogger(CursoService.class.getName()).log(Level.SEVERE, null, ex);
//        }
//
//        montarCampoResolucaCUV(curso);
//        montarCampoBoletimServico(curso);
//
//        curso.setCodigo(getProximoCodigoDisponivel());
//        curso.setStatus(SituacaoCurso.SITUACAO_ATIVO);
//
//        try {
//            cursoDAO.getPorCodigo(curso.getCodigo());
//            throw new ViolacaoDeChaveUnicaException("C�digo de curso j� cadastrado: " + curso.getCodigo());
//        } catch (ObjetoNaoEncontradoException e) {
//            cursoDAO.inclui(curso);
//
//            salvarCoordenacao(curso, coordCurso);
//
//            siadCursoService.incluirNoSiad(curso, coordCurso);
//
//            salvarCursoLocalidadesNoSIAD(curso);
//
//        }
//    }
//
//    @Transactional(rollbackFor={RuntimeException.class, ViolacaoDeChaveUnicaException.class, InfraestruturaException.class})
//    public void alterar(Curso curso, Coordenacao coordCurso) throws ObjetoRemovidoException, ServiceException {
//
//        System.out.println(">>>>>>>>>> CursoService address:"+((Object)this).toString());
//
//        if (curso.getDataVigencia() == null) {
//            curso.setDataVigencia(new GregorianCalendar());
//        }
//
//        montarCampoResolucaCUV(curso);
//        montarCampoBoletimServico(curso);
//
//        Curso c = null;
//        try {
//            c = getPorNomeELocalidade(curso.getNome(), curso.getLocalidadePrincipal());
////            if (c != null) {
//                if (!curso.getIdCurso().equals(c.getIdCurso())) {
//                    throw new ServiceException("J� existe um curso com o mesmo nome na mesma localidade.");
//                }
////            }
//        } catch (ObjetoNaoEncontradoException ex) {
////            Logger.getLogger(CursoService.class.getName()).log(Level.SEVERE, null, ex);
//        }
//
//        Curso cursoPersistente = null;
//
//        //o codigo n�o deve ser preenchido na tela, por�m estou verificando se o c�digo foi preenchido
//        try {
//            cursoPersistente = cursoDAO.getPorIdComLock(curso.getIdCurso());
//            if (!cursoPersistente.getCodigo().equals(curso.getCodigo())) {
//                throw new ServiceException(getMensagemBundled(ConstantesAplicacao.CAMINHO_BUNDLE_SERVICE, "erroCodigoCursoPreenchidoNaTela"));
//            }
//
//        } catch (ObjetoNaoEncontradoException ex) {
//            throw new ObjetoRemovidoException(getMensagemBundled(ConstantesAplicacao.CAMINHO_BUNDLE_SERVICE, "msgItemRemovidoOutroUsuario"));
//        }
//
//        salvarCoordenacao(curso, coordCurso);
//
//        excluirTurnosAntigos(curso);
//
//
//        cursoDAO.altera(curso);
//        siadCursoService.alterarNoSiad(curso, coordCurso);
//
//        salvarCursoLocalidadesNoSIAD(curso);
//    }
//
//    private void excluirTurnosAntigos(Curso curso) throws ObjetoRemovidoException {
//        Curso cursoAntigo = null;
//        try {
//            cursoAntigo = getComTurnos(curso);
//        } catch (ObjetoNaoEncontradoException ex) {
//            throw new ObjetoRemovidoException("O curso '" + curso + "' foi removido por outro usu�rio.");
//        }
//
//        for (CursoTurno cursoTurno : cursoAntigo.getCursoTurnos()) {
//            if (!curso.getCursoTurnos().contains(cursoTurno)) {
//                cursoTurnoService.excluir(cursoTurno);
//            }
//        }
//
//
//    }
//
//    @Transactional
//    public void incluirSemGerarCodigo(Curso curso) throws ViolacaoDeChaveUnicaException, ServiceException {
//
//        if (curso.getReconhecimentos() == null) {
//            throw new ServiceException("Insira pelo menos um Reconhecimento de Curso");
//        }
//        curso.setStatus(SituacaoCurso.SITUACAO_ATIVO);
//
//        try {
//            cursoDAO.getPorCodigo(curso.getCodigo());
//            throw new ViolacaoDeChaveUnicaException("C�digo de curso j� cadastrado: " + curso.getCodigo());
//        } catch (ObjetoNaoEncontradoException e) {
//            try {
//                cursoDAO.inclui(curso);
//            } catch (ConstraintViolationException ex) {
//                throw new ViolacaoDeChaveUnicaException(ex.getMessage());
//            }
//        }
//
//
//    }
//
//    private void salvarCursoLocalidadesNoSIAD(Curso curso) {
//
//        Set<SiadLocalidadeCursoTransiente> conjuntoLocalidadesSIAD = siadLocalidadeCursoService.getPorCurso(curso);
//
//        for (SiadLocalidadeCursoTransiente siadLocalidadeCurso : conjuntoLocalidadesSIAD) {
//            boolean achou = false;
//            for (CursoLocalidade cursoLocalidade : curso.getCursoLocalidades()) {
//                if (cursoLocalidade.getLocalidade().getCodigo().intValue() == siadLocalidadeCurso.CODLOCALIDADE.intValue()) {
//                    achou = true;
//                    break;
//                }
//            }
//            if (!achou) {
//                siadLocalidadeCursoService.excluirDoSiad(siadLocalidadeCurso);
//            }
//        }
//        for (CursoLocalidade cursoLocalidade : curso.getCursoLocalidades()) {
//            try {
//                siadLocalidadeCursoService.incluirNoSiad(cursoLocalidade);
//            } catch (ViolacaoDeChaveUnicaException ex) {
//                //j� existe no siad, n�o precisa fazer nada
//            }
//        }
//    }
//
//    private void salvarCoordenacao(Curso curso, Coordenacao coordCurso) throws ObjetoRemovidoException, ObjetoRemovidoException, ServiceException {
//        Coordenacao coordBancoDeMesmoCurso = null;
//        Coordenacao coordBancoDeMesmoId = null;
//        try {
//            coordBancoDeMesmoCurso = coordenacaoService.getPorCurso(curso);
//            //se existir alguma diferente da atual ou se a atual for nula, remover a referencia da encontrada
//            if (coordCurso != null && coordCurso.equals(coordBancoDeMesmoCurso)) {//n�o precisa verificar se o curso � igual pq o getPorCurso j� validou isso
//                return;
//            }
//
//            coordBancoDeMesmoCurso.setCurso(null);
//            coordenacaoService.alterar(coordBancoDeMesmoCurso);
//
//        } catch (ObjetoNaoEncontradoException ex) {
//        }
//        if (coordCurso != null) {
//            try {
//                coordBancoDeMesmoId = coordenacaoService.getPorId(coordCurso.getIdCoordenacao());
//            } catch (ObjetoNaoEncontradoException ex) {
//                throw new ObjetoRemovidoException("A coordena��o '" + coordCurso + "' foi removida por outro usu�rio.");
//            }
//
//            if (coordBancoDeMesmoId.getCurso() != null && !coordBancoDeMesmoId.getCurso().equals(curso)) {
//                throw new ServiceException("A coordena��o '" + coordBancoDeMesmoId + "' selecionada j� est� sendo usada para o curso '" + coordBancoDeMesmoId.getCurso() + "'.");
//            }
//
//            coordenacaoService.alterar(coordCurso);
//        }
//
//    }
//
//    public void montarCampoResolucaCUV(Curso curso) {
//        if (curso.getAtoAdministrativoCUV() == null || curso.getDataCUV() == null || curso.getNumeroCUV() == null) {
//            return;
//        }
//
//        StringBuffer campoCUV = new StringBuffer();
//
//        campoCUV.append(curso.getAtoAdministrativoCUV().toUpperCase(new Locale("pt", "BR")));
//
//        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//        String dataFormatada = sdf.format(curso.getDataCUV().getTime()).toString();
//
//        campoCUV.append(" " + curso.getNumeroCUV()/*+"/"+curso.getDataCUV().getTime().getYear()
//                 */ + " DE " + dataFormatada);
//
//        curso.setResolucaoCuv(campoCUV.toString());
//    }
//
//    public void montarCampoBoletimServico(Curso curso) {
//        if (curso.getNumeroBS() == null || curso.getDataBS() == null) {
//            return;
//        }
//
//        StringBuffer campoBS = new StringBuffer();
//
//        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
//        String dataFormatada = sdf.format(curso.getDataBS().getTime()).toString();
//
//        campoBS.append(curso.getNumeroBS() + " DE " + dataFormatada);
//
//        curso.setBoletimServico(campoBS.toString());
//    }
//
//    @Transactional
//    private void removerReconhecimentosQueSobraramNoBanco(Curso cursoNovaVersao, Curso cursoVelhaVersao) {
//
//        for (ReconhecimentoCurso reconhecimentoAntigo : cursoVelhaVersao.getReconhecimentos()) {
//            if (!cursoNovaVersao.getReconhecimentos().contains(reconhecimentoAntigo)) {
//                reconhecimentoCursoDAO.exclui(reconhecimentoAntigo);
//            }
//
//        }
//    }
//
//    @Transactional
//    public void excluir(Curso curso) throws ObjetoReferenciadoException {
//
//        Curso cursoPersistente = null;
//
//        try {
//            cursoPersistente = cursoDAO.getPorIdComLock(curso.getIdCurso());
//        } catch (ObjetoNaoEncontradoException e) {
//        }
//
//        List<Desdobramento> desdobramentos = null;
//        desdobramentos =
//                desdobramentoDAO.getPorCurso(curso);
//
//        if (desdobramentos.size() > 0) {
//            throw new ObjetoReferenciadoException(getMensagemBundled(ConstantesAplicacao.CAMINHO_BUNDLE_SERVICE, "msgCursoReferenciadoPorDesdobramento"));
//        }
//
//        cursoDAO.exclui(cursoPersistente);
//    }
//
//    public void gerarCarteirasAlunosPorListaMatricula(List<String> matriculas) throws ServiceException, ObjetoNaoEncontradoException {
//
//        // Por favor alguem coloque isso em um service adequado..... (Marcello - durante a refatoracao de curriculo)
//
//        Relatorio dec = RelatorioFactory.getRelatorio(Relatorio.CARTEIRA_ALUNO);
//        Curso curso = null;
//        List<Aluno> alunos = new ArrayList();
//        for (String matricula : matriculas) {
//            Aluno a = alunoService.getPorMatricula(matricula);
//            if (a != null) {
//                alunos.add(a);
//            }
//
//        }
//        List<CarteiraAlunoModel> carteiraAlunoModel = new ArrayList();
//        for (Aluno aluno : alunos) {
//            if (aluno != null) {
//                CarteiraAlunoModel model = new CarteiraAlunoModel();
//                model.setLocalidade(aluno.getLocalidade().getNome().toUpperCase());
//                model.setCurso(aluno.getCurso().getNome());
//                model.setNome(aluno.getIdentificacao().getNome().toUpperCase());
//                model.setMatricula(aluno.getMatricula());
//                carteiraAlunoModel.add(model);
//                curso =
//                        aluno.getCurso();
//            }
//
//        }
//        HashMap map = new HashMap();
//        map.put("curso", curso);
//
//        try {
//            dec.gerarRelatorio(carteiraAlunoModel, map);
//        } catch (RelatorioException ex) {
//            throw new ServiceException(ex);
//        }
//
//    }
//
//    public List<Curso> getListaCursosPorGrau(Grau grau) {
//        return cursoDAO.getPorGrau(grau);
//    }
//
//    public List<Curso> getListaCursosGraduacao() throws ServiceException {
//        Grau grau;
//        try {
//            grau = grauService.getPorSigla("GD");
//        } catch (ObjetoNaoEncontradoException ex) {
//            //logger.error("Erro buscar grau da Gradua��o", ex);
//            throw new ServiceException("Ocorreu um erro ao buscar a lista dos " +
//                    "cursos de gradua��o. Entre em contato com o suporte.");
//        }
//
//        return cursoDAO.getPorGrau(grau);
//    }
//
//    public List<Curso> getListaOrdenada() {
//        return cursoDAO.getListaOrdenada();
//    }
//
//    public List<Curso> getListaOrdenadaPorCodigo() {
//        return cursoDAO.getListaOrdenadaPorCodigo();
//    }
//
//    public List<Curso> getListaCursosPorUnidade(Unidade unidade) {
//        return cursoDAO.getPorUnidade(unidade);
//    }
//
//    public List<Curso> getListaOrdenadaComGrauEUnidade() {
//        return cursoDAO.getListaOrdenadaComGrauEUnidade();
//    }
//
//    public Curso getPorId(
//            Long idCurso) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorId(idCurso);
//    }
//
//    public Curso getPorNome(
//            String nomeCurso) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorNome(nomeCurso);
//    }
//
//    public Curso getPorCodigo(
//            Long codigo) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorCodigo(codigo);
//    }
//
//    public Curso getPorDesdobramento(
//            Desdobramento d) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorDesdobramento(d);
//    }
//
//    public List<Curso> getListaOrdenadaDeAtivos() {
//        return cursoDAO.getListaOrdenadaDeAtivos();
//    }
//
//    public List<Curso> getListaOrdenadaEFiltradaParaRelatorio(String tipoOrdenacao, String tipoFiltro, String filtro) {
//        return cursoDAO.getListaOrdenadaEFiltradaParaRelatorio(tipoOrdenacao, tipoFiltro, filtro);
//    }
//
//    public Curso getPorIdComGrau(
//            Long idCurso) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorIdComGrau(idCurso);
//    }
//
//    private synchronized Long getProximoCodigoDisponivel() {
//        List<Long> codigosCursos = cursoDAO.getListaDeCodigosOrdenados();
//        Long sequencia = 0l;
//
//        for (Long codigoAtual : codigosCursos) {
//            if (!codigoAtual.equals(sequencia + 1)) {
//                return sequencia + 1;
//            }
//
//            sequencia = codigoAtual;
//        }
//
//        return sequencia + 1;
//    }
//
//
//    public List<Curso> getPorCodigoOuNomeLike(String codigoOuNome){
//        return cursoDAO.getPorCodigoOuNomeLike(codigoOuNome,codigoOuNome +"%");
//    }
//
//
//    public void gerarRelatorioDeCursos(List<Curso> listaCursos) throws ServiceException{
//
//        List<ModeloRelatorioCurso> dados = new ArrayList<ModeloRelatorioCurso>(listaCursos.size());
//
//        for (Curso curso : listaCursos) {
//            ModeloRelatorioCurso modeloRelatorioCurso = new ModeloRelatorioCurso(curso);
//            dados.add(modeloRelatorioCurso);
//        }
//
//        Relatorio dec = RelatorioFactory.getRelatorio(Relatorio.RELATORIO_CURSOS);
//
//        Map map = new HashMap();
//
//        try {
//            dec.gerarRelatorio(dados, map);
//        } catch (RelatorioException ex) {
//            throw new ServiceException(ex);
//        }
//
//    }
//
//    public Curso getComTurnos(
//            Curso curso) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getComTurnos(curso);
//    }
//
//    public Curso getPorNomeELocalidade(String nome, Localidade localidade) throws ObjetoNaoEncontradoException {
//        return cursoDAO.getPorNomeELocalidade(nome, localidade);
//    }
//}

